package com.cskaoyan.javase.oop2._1extends._6protected._4clone;
/**
 * Object类是Java中所有类的父类
 * 而Object类当中有一个protected修饰的成员方法: clone()
 * 首先要注意,没有任何自定义类,会和Object类同包
 * 而不同包下的子类中,必须创建子类自身对象才能够访问
 *
 * @since 10:18
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) throws CloneNotSupportedException {
        // 创建Student类的对象,能不能调用clone方法?
        Student s = new Student();
        // 'clone()' has protected access in 'java.lang.Object'
        // s.clone();

        // 只能自己用自己的
        new Demo().clone();
        // new Object().clone();

        // 重写访问权限后,同包下任意访问
        new Teacher().clone();
    }
}
class Student{
    /*
        在Student类当中使用clone方法
      */
    public void test() throws CloneNotSupportedException {
        // Unhandled exception: java.lang.CloneNotSupportedException
        clone();
    }

    public static void testStatic() throws CloneNotSupportedException {
        new Student().clone();
    }
}
class Teacher{
    /*
        一般来说,clone方法自己克隆自己没有太大意义
            所以为了让能够在类的外部调用clone方法
            需要重写方法的访问权限
      */
    @Override
    protected Object clone() throws CloneNotSupportedException {
        return super.clone();
    }
}